package edu.client;

import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;

import edu.shared.DTO.InsumoDTO;
import edu.shared.DTO.OrdenCompraInsumoDTO;
import edu.shared.DTO.ProveedorDTO;

public class P_PantallaGerenteCompras extends Composite {

	private Constantes constante = GWT.create(Constantes.class);

	private int ancho;
	private int alto;
	private int anchoLateral;
	private DockPanel contenedor;
	private LayoutPanel superior;
	private Label logoEmpresa;
	private Label lblUsuario;
	private Label logotipo;
	private Label menuLabel;
	private Button btnCerrarSesin;
	private LayoutPanel menu;
	
	private Tree menuLateral;
	private TreeItem nuevoProveedor;
	private TreeItem buscarProveedor;
	private TreeItem buscar;
	private TreeItem guardadas;
	private TreeItem deInsumos;
	private TreeItem ordenCompraInsumos;
		
	private TreeItem ordenCompraProducto;
	private TreeItem validarOrdenCompraProducto;
	private TreeItem crearOrdenCompraProducto;
	private TreeItem editarOrdenCompraProducto;
	private TreeItem buscarOrdenCompraProducto;
	private TreeItem imprimirOrdenCompraProducto;
	private TreeItem solicitarPresupuesto;
	
	private TabPanel panelTrabajo;
	private ScrollPanel formulario;
	private ProveedorDTO proveedorSelec;
	private List<InsumoDTO> listaOrdenCompraInsumo;
	private String proveedorElegido;
	private String usuario;
	private OrdenCompraInsumoDTO ordenInsumo;

	public P_PantallaGerenteCompras(String usuarioLogueado) {

		Window.setTitle("INTESA - COMPRAS");

		usuario = usuarioLogueado;
		ancho = Window.getClientWidth() - 15;
		alto = Window.getClientHeight() - 13;
		//anchoLateral = 180;
		anchoLateral = 230;
		contenedor = new DockPanel();
		contenedor.setStyleName("panelFondo");
		contenedor.setSize(ancho + "px", alto + "px");
		initWidget(contenedor);

		superior = new LayoutPanel();
		superior.setStyleName("superior");
		superior.setSize(ancho + "px", "75px");
		contenedor.add(superior, DockPanel.NORTH);

		logoEmpresa = new Label("");

		logoEmpresa.setStyleName("imagenLogo");
		superior.add(logoEmpresa);
		superior.setWidgetLeftWidth(logoEmpresa, 0.0, Unit.PX, 556.0, Unit.PX);
		superior.setWidgetTopHeight(logoEmpresa, 0.0, Unit.PX, 75.0, Unit.PX);

		lblUsuario = new Label(constante.usuario() + ": " + usuarioLogueado.toUpperCase());
		lblUsuario.setStyleName("labelSuperior");
		lblUsuario.setDirectionEstimator(true);
		lblUsuario.setWidth("500px");
		superior.add(lblUsuario);

		superior.setWidgetLeftWidth(lblUsuario, (ancho - (ancho / 2)), Unit.PX, 500.0, Unit.PX);
		superior.setWidgetTopHeight(lblUsuario, 16.0, Unit.PX, 29.0, Unit.PX);
		btnCerrarSesin = new Button(constante.cerrarSesion());
		btnCerrarSesin.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cerrar();
			}
		});
		btnCerrarSesin.setStyleName("botonSuperior");
		superior.add(btnCerrarSesin);
		superior.setWidgetLeftWidth(btnCerrarSesin, ancho - 150, Unit.PX, 130, Unit.PX);
		superior.setWidgetTopHeight(btnCerrarSesin, 51.0, Unit.PX, 24.0, Unit.PX);

		menu = new LayoutPanel();
		menu.setStyleName("menuLateral");
		menu.setSize(anchoLateral + "px", (alto - 90) + "px");
		contenedor.add(menu, DockPanel.WEST);

		/**
		 * Arma el menú del panel lateral
		 * 
		 */
		logotipo = new Label("");
		logotipo.setStyleName("imagenIntesa");
		menu.add(logotipo);
		menu.setWidgetLeftWidth(logotipo, 5.0, Unit.PX, 150.0, Unit.PX);
		menu.setWidgetTopHeight(logotipo, alto - 250, Unit.PX, 150.0, Unit.PX);

		menuLateral = new Tree();
		menu.add(menuLateral);
		menuLateral.setSize("100%", "100%");

		TreeItem proveedores = menuLateral.addItem(constante.proveedores());
		proveedores.setStyleName("elementoMenu");

		nuevoProveedor = new TreeItem(constante.nuevo());
		nuevoProveedor.setStyleName("suElementoMenu");
		proveedores.addItem(nuevoProveedor);

		buscarProveedor = new TreeItem(constante.buscar());
		buscarProveedor.setStyleName("suElementoMenu");
		proveedores.addItem(buscarProveedor);

		TreeItem ordenCompra = menuLateral.addItem("ORDEN DE COMPRA DE INSUMOS");
		ordenCompra.setStyleName("elementoMenu");

		deInsumos = new TreeItem("CREAR");
		deInsumos.setStyleName("suElementoMenu");
		ordenCompra.addItem(deInsumos);
		
		guardadas = new TreeItem(constante.guardadas());
		guardadas.setStyleName("suElementoMenu");
		ordenCompra.addItem(guardadas);

		buscar = new TreeItem(constante.buscar());
		buscar.setStyleName("suElementoMenu");
		ordenCompra.addItem(buscar);

		ordenCompraInsumos = new TreeItem("VALIDAR");
		ordenCompraInsumos.setStyleName("suElementoMenu");
		ordenCompra.addItem(ordenCompraInsumos);	
		
		//creamos el item del árbol para gestionar las órdenes de compra de productos
		ordenCompraProducto = menuLateral.addItem(constante.ordenDeCompraDeProductos());
		ordenCompraProducto.setStyleName("elementoMenu");
				
		//subitem "crear" dentro de "orden de compra de producto"
		crearOrdenCompraProducto = new TreeItem("CREAR");
		crearOrdenCompraProducto.setStyleName("suElementoMenu");
		ordenCompraProducto.addItem(crearOrdenCompraProducto);
		
		//subitem "editar" dentro de "orden de compra de producto"
		editarOrdenCompraProducto = new TreeItem("EDITAR");
		editarOrdenCompraProducto.setStyleName("suElementoMenu");
		ordenCompraProducto.addItem(editarOrdenCompraProducto);
		
		//subitem "buscar" dentro de "orden de compra de producto"
		buscarOrdenCompraProducto = new TreeItem("BUSCAR");
		buscarOrdenCompraProducto.setStyleName("suElementoMenu");
		ordenCompraProducto.addItem(buscarOrdenCompraProducto);
		
		//subitem "imprimir" dentro de "orden de compra de producto"
		imprimirOrdenCompraProducto = new TreeItem("IMPRIMIR");
		imprimirOrdenCompraProducto.setStyleName("suElementoMenu");
		ordenCompraProducto.addItem(imprimirOrdenCompraProducto);
		
		//subitem "solicitar presupuesto" dentro de "orden de compra de producto"
		solicitarPresupuesto = new TreeItem("SOLICITAR PRESUPUESTO");
		solicitarPresupuesto.setStyleName("suElementoMenu");
		ordenCompraProducto.addItem(solicitarPresupuesto);
				
		//subitem "validar" dentro de "orden de compra de producto"
		validarOrdenCompraProducto = new TreeItem(constante.validar());
		validarOrdenCompraProducto.setStyleName("suElementoMenu");
		ordenCompraProducto.addItem(validarOrdenCompraProducto);

		/**
		 * Panel central, contiene las distintos formularios que se van
		 * agregando en pestañas cada vez que se elige un formulario del panel
		 * lateral
		 */
		panelTrabajo = new TabPanel();
		panelTrabajo.setAnimationEnabled(true);
		panelTrabajo.setStyleName("panelTrabajo");

		contenedor.add(panelTrabajo, DockPanel.CENTER);
		panelTrabajo.setSize((ancho - anchoLateral - 10) + "px", (alto - 90) + "px");
		
		menuLabel = new Label("");
		menuLabel.setStyleName("imagenMenu");
		menu.add(menuLabel);
		menu.setWidgetRightWidth(menuLabel, -17.0, Unit.PX, 15.0, Unit.PX);
		menu.setWidgetTopHeight(menuLabel, 40.0, Unit.PCT, 65.0, Unit.PX);
		
		menuLabel.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (menuLateral.isVisible())
					ocultarMenu();
				else
					mostrarMenu();
			}
		});
		
		menuLateral.addSelectionHandler(new SelectionHandler<TreeItem>() {
			public void onSelection(SelectionEvent<TreeItem> event) {
				procesa(event);
			}
		});
		
		panelTrabajo.addSelectionHandler(new SelectionHandler<Integer> (){
			public void onSelection(SelectionEvent<Integer> event) {
				if (menuLateral.isVisible())
					ocultarMenu();
			}
		});

		Window.addWindowClosingHandler(new Window.ClosingHandler() {
			public void onWindowClosing(Window.ClosingEvent closingEvent) {
				closingEvent.setMessage("");
			}
		});

	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	protected void cerrar() {

		int cantidad = RootPanel.get().getWidgetIndex(this);
		RootPanel.get().remove(cantidad);
		P_Login log = new P_Login();
		RootPanel.get().add(log);
		try {
			this.finalize();
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}

	protected void procesa(SelectionEvent<TreeItem> event) {

		String titulo;
		int tab;

		if (event.getSelectedItem() == nuevoProveedor) {

			titulo = constante.nuevoProveedor();
			tab = Validaciones.numeroElemento(panelTrabajo, titulo);
			if (tab == -1) {
				P_FormularioProveedor proveedor = new P_FormularioProveedor(panelTrabajo);
				cargarPantalla(proveedor, titulo);

			} else
				panelTrabajo.selectTab(tab);
		}

		else if (event.getSelectedItem() == buscarProveedor) {

			if (Validaciones.numeroElemento(panelTrabajo, constante.modificarProveedor()) != -1) {
				Window.alert("Para realizar una nueva busqueda debe cerrar previamente la pestaña \"MODIFICAR PROVEEDOR\"");
			} else {

				final P_BuscarProveedor popUp = new P_BuscarProveedor();
				popUp.setGlassEnabled(true);
				popUp.center();
				popUp.show();
				ocultarMenu();
				popUp.addCloseHandler(new CloseHandler<PopupPanel>() {

					@Override
					public void onClose(CloseEvent<PopupPanel> event) {

						proveedorSelec = popUp.getProveedorDTO();
						boolean modificar = popUp.getModificarProveedor();
						boolean salirEliminar = popUp.getSalirEliminar();
						boolean salirContacto = popUp.getSalirContacto();

						if (modificar == true) {
							modificarProveedor();
						}
						if (salirEliminar == true) {
							buscar();
						}
						if (salirContacto == true) {
							buscar();
						}
					}
				});

			}

		}

		else if (event.getSelectedItem() == guardadas) {

			if (Validaciones.numeroElemento(panelTrabajo, constante.modificarOrdenDeCompraDeInsumo()) != -1 || Validaciones.numeroElemento(panelTrabajo, constante.modificarOrdenDeCompraDeProductos()) != -1) {
				Window.alert("Para realizar una nueva busqueda debe cerrar previamente la pestaña \"MODIFICAR ORDEN DE COMPRA\"");
			} else {

				final P_VerOrdenesGuardadas popUp = new P_VerOrdenesGuardadas("GERENTE DE COMPRAS", this.usuario);
				popUp.setGlassEnabled(true);
				popUp.center();
				popUp.show();
				ocultarMenu();
				popUp.addCloseHandler(new CloseHandler<PopupPanel>() {

					@Override
					public void onClose(CloseEvent<PopupPanel> event) {

						boolean modificar = popUp.getModificarOrden();
						if (modificar == true) {
							ordenInsumo = popUp.getOrdenElegida();
							modificarOrden();
						}
					}
				});

			}

		}

		else if (event.getSelectedItem() == buscar) {

			final P_BuscarOrdenesCompra popUp = new P_BuscarOrdenesCompra();
			popUp.setGlassEnabled(true);
			popUp.center();
			popUp.show();
			ocultarMenu();
			popUp.addCloseHandler(new CloseHandler<PopupPanel>() {

				@Override
				public void onClose(CloseEvent<PopupPanel> event) {

					if (popUp.getImprimirOrden()) {
						abrirPantallaImpresion(popUp.formulario());
					} else if (popUp.getCancelarOrden()) {

					} else if (popUp.getCerrarOrden()) {

					} else if (popUp.getSalirOrden()) {

					}

				}
			});

		}

		else if (event.getSelectedItem() == deInsumos) {

			if (Validaciones.numeroElemento(panelTrabajo, constante.ordenDeCompraDeInsumos()) != -1) {
				Window.alert("Para realizar una nueva busqueda debe cerrar previamente la pestaña \"ORDEN DE COMPRA DE INSUMOS\"");
			} else {

				final P_RequerimientoInsumo popUp = new P_RequerimientoInsumo();
				popUp.setGlassEnabled(true);
				popUp.center();
				popUp.show();
				ocultarMenu();
				popUp.addCloseHandler(new CloseHandler<PopupPanel>() {

					@Override
					public void onClose(CloseEvent<PopupPanel> event) {

						listaOrdenCompraInsumo = popUp.getListaOrdenCompraInsumo();
						proveedorElegido = popUp.getProveedorElegido();
						boolean agregarOrden = popUp.getAgregarOrden();

						if (agregarOrden == true) {
							agregarOrden();
						}
					}
				});
			}

		}

		else if (event.getSelectedItem() == ordenCompraInsumos) {

			P_ValidarCancelarOrdenCompraInsumos popUp = new P_ValidarCancelarOrdenCompraInsumos();
			popUp.setGlassEnabled(true);
			popUp.center();
			popUp.show();
			ocultarMenu();

		}

		else if (event.getSelectedItem() == validarOrdenCompraProducto) {

			titulo = "VALIDAR ORDEN COMPRA PRODUCTO";
			
			//buscamos si ya existe una pestaña creada con esta funcionalidad
			tab = Validaciones.numeroElemento(panelTrabajo, titulo);
			
			//si no hay una pesataña con la funcionalidad seleccionada
			if (tab == -1) {
				P_ValidarCancelarOrdenCompraProducto pValidarOrdenCompraProducto = new P_ValidarCancelarOrdenCompraProducto(panelTrabajo);
				cargarPantalla(pValidarOrdenCompraProducto, titulo);
			} 
			
			//si ya estaba la pestaña abierta, la seleccionamos
			else
				panelTrabajo.selectTab(tab);
		}
		
		else if (event.getSelectedItem() == crearOrdenCompraProducto) {

			titulo = "CREAR ORDEN COMPRA PRODUCTO";
			
			tab = Validaciones.numeroElemento(panelTrabajo, titulo);
			
			//si no hay una pesataña con la funcionalidad seleccionada
			if (tab == -1) 
			{
				P_CrearOrdenCompraProductoSeleccion pCrearOrdenCompraProducto = new P_CrearOrdenCompraProductoSeleccion(panelTrabajo);
				cargarPantalla(pCrearOrdenCompraProducto, titulo);
			}
			
			//si ya estaba la pestaña abierta, la seleccionamos
			else
				panelTrabajo.selectTab(tab);
		}
		
		else if (event.getSelectedItem() == editarOrdenCompraProducto) {

			titulo = "EDITAR ORDEN COMPRA PRODUCTO";
			
			tab = Validaciones.numeroElemento(panelTrabajo, titulo);
			
			//si no hay una pesataña con la funcionalidad seleccionada
			if (tab == -1) 
			{
				P_EditarOrdenCompraProductoSeleccion pEditarOrdenCompraProducto = new P_EditarOrdenCompraProductoSeleccion(panelTrabajo);
				cargarPantalla(pEditarOrdenCompraProducto, titulo);
			}
			
			//si ya estaba la pestaña abierta, la seleccionamos
			else
				panelTrabajo.selectTab(tab);
		}
		
		else if (event.getSelectedItem() == buscarOrdenCompraProducto) {

			titulo = "BUSCAR ORDEN COMPRA PRODUCTO";
			
			tab = Validaciones.numeroElemento(panelTrabajo, titulo);
			
			//si no hay una pesataña con la funcionalidad seleccionada
			if (tab == -1) 
			{
				P_BuscarOrdenCompraProducto pBuscarOrdenCompraProducto = new P_BuscarOrdenCompraProducto(panelTrabajo);
				cargarPantalla(pBuscarOrdenCompraProducto, titulo);
			}
			
			//si ya estaba la pestaña abierta, la seleccionamos
			else
				panelTrabajo.selectTab(tab);
		}
		
		else if (event.getSelectedItem() == imprimirOrdenCompraProducto) {

			titulo = "IMPRIMIR ORDEN COMPRA PRODUCTO";
			
			tab = Validaciones.numeroElemento(panelTrabajo, titulo);
			
			//si no hay una pesataña con la funcionalidad seleccionada
			if (tab == -1) 
			{
				P_ImprimirOrdenCompraProducto pImprimirOrdenCompraProducto = new P_ImprimirOrdenCompraProducto(panelTrabajo);
				cargarPantalla(pImprimirOrdenCompraProducto, titulo);
			}
			
			//si ya estaba la pestaña abierta, la seleccionamos
			else
				panelTrabajo.selectTab(tab);
		}
		
		else if (event.getSelectedItem() == solicitarPresupuesto) {

			titulo = "SOLICITAR PRESUPUESTO";
			
			tab = Validaciones.numeroElemento(panelTrabajo, titulo);
			
			//si no hay una pesataña con la funcionalidad seleccionada
			if (tab == -1) 
			{
				P_SolicitarPresupuesto pSolicitarPresupuesto = new P_SolicitarPresupuesto(panelTrabajo);
				cargarPantalla(pSolicitarPresupuesto, titulo);
			}
			
			//si ya estaba la pestaña abierta, la seleccionamos
			else
				panelTrabajo.selectTab(tab);
		}
	}
	
	protected void abrirPantallaImpresion(FlexTable formu) {
		P_ImpresionCompras imprime = new P_ImpresionCompras(formu, usuario, "GERENTE DE COMPRAS");
		RootPanel.get().remove(RootPanel.get().getWidgetIndex(this));
		RootPanel.get().add(imprime);
		try {
			this.finalize();
		} catch (Throwable e) {
			e.printStackTrace();
		}

	}

	protected void agregarOrden() {

		String titulo;
		int tab;
		titulo = constante.ordenDeCompraDeInsumos();
		tab = Validaciones.numeroElemento(panelTrabajo, titulo);

		if (tab == -1) {
			P_FormularioOrdenCompraInsumo ordenCompra = new P_FormularioOrdenCompraInsumo(panelTrabajo, listaOrdenCompraInsumo, proveedorElegido, titulo, usuario, "GERENTE DE COMPRAS");
			cargarPantalla(ordenCompra, titulo);
			} 
		else
			panelTrabajo.selectTab(tab);

	}

	protected void modificarOrden() {

		String titulo;
		int tab;
		titulo = constante.modificarOrdenCompraDeInsumo();
		tab = Validaciones.numeroElemento(panelTrabajo, titulo);

		if (tab == -1) {
			P_FormularioOrdenCompraInsumo ordenCompra = new P_FormularioOrdenCompraInsumo(panelTrabajo, titulo, ordenInsumo, "GERENTE DE COMPRAS");
			cargarPantalla(ordenCompra, titulo);
			} 
		else
			panelTrabajo.selectTab(tab);

	}

	protected void modificarProveedor() {
		String titulo;
		int tab;
		titulo = constante.modificarProveedor();
		tab = Validaciones.numeroElemento(panelTrabajo, titulo);

		if (tab == -1) {
			P_FormularioProveedor proveedor = new P_FormularioProveedor(panelTrabajo, this.proveedorSelec, titulo);
			cargarPantalla(proveedor, titulo);
			} 
		else
			panelTrabajo.selectTab(tab);

	}

	protected void buscar() {

		final P_BuscarProveedor popUp = new P_BuscarProveedor();
		popUp.setGlassEnabled(true);
		popUp.center();
		popUp.show();
		ocultarMenu();
		popUp.addCloseHandler(new CloseHandler<PopupPanel>() {

			@Override
			public void onClose(CloseEvent<PopupPanel> event) {

				proveedorSelec = popUp.getProveedorDTO();
				boolean modificar = popUp.getModificarProveedor();
				boolean salirEliminar = popUp.getSalirEliminar();

				if (modificar == true) {
					modificarProveedor();
				}
				if (salirEliminar == true) {
					buscar();
				}
			}
		});

	}
	
	//CÓDIGO IMPLEMENTADO EN SEGUNDA ETAPA
	
	private void cargarPantalla(Composite pantalla, String titulo)
	{
		formulario = new ScrollPanel();
		formulario.setTitle(titulo);
		formulario.setStyleName("panelFormulario");
		//formulario.setSize("100%", (alto - 145) + "px");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(pantalla);
		panelTrabajo.add(formulario, titulo, false);
		panelTrabajo.selectTab(Validaciones.numeroElemento(panelTrabajo, titulo));		
	}
	
	private void ocultarMenu() {
		menuLateral.setFocus(false);
		menuLateral.setVisible(false);
		menu.setWidth("0px");
		menu.setWidgetLeftWidth(menuLabel, -5.0, Unit.PX, 15.0, Unit.PX);
		menu.setStyleName("menuLateralOculto");
		panelTrabajo.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < panelTrabajo.getWidgetCount(); i++)
			panelTrabajo.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");

		logotipo.setVisible(false);
	}
	
	private void mostrarMenu() {
		menuLateral.setFocus(true);
		menuLateral.setVisible(true);
		//menu.setWidth("180px");
		menu.setWidth("230px");
		menu.setWidgetRightWidth(menuLabel, -17.0, Unit.PX, 15.0, Unit.PX);
		menu.setStyleName("menuLateral");
		panelTrabajo.setSize((ancho - anchoLateral - 10) + "px", (alto - 90) + "px");
		
		for(int i = 0; i < panelTrabajo.getWidgetCount(); i++)
			panelTrabajo.getWidget(i).setSize((ancho - anchoLateral - 25) + "px",(alto - 145) + "px");

		logotipo.setVisible(true);
	}
}
